import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Tools{
    //-c   字符数
    // -W  词数
    // -l  行数
    // -o  指定输出文件
    // -e  停用词表，接文件名
    // -a  返回更复杂的数据（代码行 / 空行 / 注释行）
    // -s  递归处理目录下符合条件的文件，接文件名
    // -x  调用高级功能
    public static final String DEFAULTPARAS[] = {"-c","-w","-l","-o","-e","-a","-s","-x"};//8个

    /*
    *
    * 将数组参数连接为字符串
    * */
    public static String junctParas(String args[]){
        String junction = "";

        for(int i=0;i<args.length;i++){
            junction += args[i]+" ";
            //System.out.println(args[i]);
        }

        return junction.trim();
    }

    /*
    * 将参数放进ｐａｒａｍｅｔｅｒ
    *
    * */
    public static  Parameter putParasToParameter(String longParas){
        String opt = null;
        String realParas[] = getRealParas(longParas);
        Parameter parameter = new Parameter();

        for(int i=0;i<realParas.length;i++){
            opt = realParas[i];
            switch (opt){
                case "-c":
                    parameter.setShowCharCount(true);
                    break;
                case "-w":
                    parameter.setShowWordCount(true);
                    break;
                case "-l":
                    parameter.setShowlineCount(true);
                    break;
                case "-o":
                    parameter.setOutput(true);
                    parameter.setOutPutFileName(getFileName("-o",longParas));
                    //System.out.println(parameter.getOutPutFileName());
                    break;
                case "-e":
                    parameter.setFilterWord(true);
                    parameter.setFilterFilename(getFileName("-e",longParas));
                    break;
                case "-a":
                    parameter.setShowMore(true);
                    break;
                case "-s":
                    parameter.setProcessMultFiles(true);
                    parameter.setFilesName(getRealFileNameFromList(getFileName("-s",longParas)));
                    break;
                case "-x":
                    parameter.setAdvance(true);
                    break;
                    default:
            }
        }
        parameter.setInputfileName(getInputFileName(longParas));

        return parameter;
    }
    /*
    *
    * 解析真实的命令参数
    * */
    private static String[] getRealParas(String longParas){
        String tmp[] = longParas.split(" ");
        List<String> realPara=new ArrayList<String>();
        for(int i=0;i<tmp.length;i++){
            for(int j=0;j<DEFAULTPARAS.length;j++){
                if( tmp[i].trim().equals(DEFAULTPARAS[j]) ){
                    realPara.add(tmp[i]);
                }
            }
        }

        return (String[])realPara.toArray(new String[realPara.size()]);
    }

    //String canshu="-c e:\\test.txt -W -l -o -s -e file.txt";
    /*
    * 基础功能，单个输入文件名获取
    *
    * */
    private static String getInputFileName(String longParas){
       String inputFileName = null;
       String tmp[] = longParas.split(" ");
       for(int i=0;i<DEFAULTPARAS.length;i++){
           for(int j=0;j<tmp.length;j++){
               if(!DEFAULTPARAS[i].equals(tmp[j]) && tmp[j].length()>2 ){
                   //System.out.println(tmp[j]+" "+DEFAULTPARAS[i]);
                   if( !tmp[j].equals(getFileName("-o",longParas)) && !tmp[j].equals(getFileName("-e",longParas)) && !tmp[j].equals(getFileName("-s",longParas))){
                       //System.out.println(getFileName("-o",longParas)+getFileName("-e",longParas)+getFileName("-s",longParas));
                       inputFileName = tmp[j];
                   }
               }
           }
       }

        return inputFileName;
    }

    /*
    *
    * 通过命令参数获取 所需文件，如：　停用词表，输出文件
    *
    * */
    private static String getFileName(String para,String paras){
        boolean isNewFile = paras.contains(para);
        String newFileName = null;
        String str[] = paras.substring(paras.indexOf(para)+3).split(" ");
        if(isNewFile){ newFileName = str[0];}
        return newFileName;
    }

    /*
    * 筛选需要用到的文件,递归做匹配相应的文件．
    *
    * */
    public static List<String> getRealFileNameFromList(String filePath){
        String processedFile = getProcessedFileName(filePath);
        String diviPath[] = getFileNameFormPath(filePath);

        List<String> fileList = getFileNameFromDir(new File(diviPath[0]));
        for(int i=0;i<fileList.size();i++){
            //System.out.println(fileList.size());
            String fileName = getFileNameFormPath(fileList.get(i))[1];
            //System.out.println(diviPath[0]+" "+processedFile);
            if(!fileName.matches(processedFile) && !diviPath[0].equals(processedFile)){//当文件名匹配不成功成功时，移除不符合规则文件
                fileList.remove(i);
                i--;
            }
        }

        return fileList;
    }

    /*
    *
    * 对文件名进行通配符解释
    *
    * */
    private static String getProcessedFileName(String filePath){

        String file[] = getFileNameFormPath(filePath);
        file[1] = file[1].replace("*",".*");//匹配任意一个或多个字符
        file[1] = file[1].replace("?",".{1,1}");//匹配任意一个字符
        //file[1] = file[0]+file[1];
        //System.out.println(file[0]+"6"+file[1]);
        return file[1];
    }

    /*
    *
    * 从路径中分离文件名和文件夹名,数组索引0为文件夹，数组索引1为文件
    * */
    private static String[] getFileNameFormPath(String filePath){
        String ret[] = new String[2];
        if(filePath.contains("/")){
            int index = filePath.lastIndexOf("/");
            int len = filePath.length();

            ret[0] = filePath;
            ret[1] = filePath;

            if(len != index+1){
                String tmp = filePath.substring(index+1);
                if(tmp.matches(".*\\.\\S*")) {
                    ret[0] = filePath.substring(0, index + 1);
                    ret[1] = filePath.substring(index + 1);
                }
            }
        }else{
            File directory = new File("");
            ret[0] = directory.getAbsolutePath();
            ret[1] = filePath;
        }
        return ret;
    }

    /*
    *
    * 获取文件件下面所有文件
    * */
    private static List<String> getFileNameFromDir(File file){
        List<String> fileList = new ArrayList<String>();
        addFileNameToList(file,fileList);
        return fileList;
    }

    /*
    *
    * 通过递归把文件加入List
    * */
    private static void addFileNameToList(File file, List<String> fileList){

        //System.out.println(file);
        File files[] = file.listFiles();

        if(files!=null) {
            for (int i = 0; i < files.length; i++) {
                //System.out.println(files.length);
                if (files[i].isFile()) {

                    fileList.add(files[i].toString());

                } else if (files[i].isDirectory()) {

                    File tmp = new File(files[i].toString());
                    addFileNameToList(tmp, fileList);

                }
            }
        }
    }

    /*
    *
    * 从文件中读取数据转换为String类型数据
    * */
    public static String text2String(File file){
        if(!file.exists())return null;
        StringBuilder result = new StringBuilder();

        try{
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s = null;
            while((s = br.readLine())!=null){//使用readLine方法，一次读一行

                result.append(s+System.lineSeparator());
                //System.out.println("+");
            }
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return result.toString();
    }

    /*
    *
    * 对所有结果进行统一设置
    * */
    public static void setResult(WordCount wordCount,Parameter parameter,Result result,String textData){

        //System.out.println(wordCount);
        //字符计数
        if(parameter.isShowCharCount()){ result.setCharCount(wordCount.getCharCount(textData)); }
        //词数计数
        //System.out.println(result);
        if(parameter.isShowWordCount()){ result.setWordCount(wordCount.getWordCount(parameter.isFilterWord(),textData)); }

        //总行计数
        if(parameter.isShowlineCount()){ result.setLineCount(wordCount.getLineCount(textData)); }

        //代码行，注释行，空行计数
        if(parameter.isShowMore()){
            result.setCodeLineCount(wordCount.getCodeLineCount(textData));
            result.setCommentLineCount(wordCount.getCommentLineCount(textData));
            result.setEmptyLineCount(wordCount.getEmptyLineCount(textData));
        }
        //输出文件名
        if(parameter.isOutput()) result.setOutPutFileName(parameter.getOutPutFileName());
        else result.setOutPutFileName("result.txt");
    }

    /*
    *
    * 格式化输出结果
    * */
    public static String formatInputData(String fileName,int charCount,int wordCount,int lineCount,int codeLineCount,int commentLineCount,int emptyLineCount){
        String ret = "文件名路径： "+fileName+" 字符数： "+ String.valueOf(charCount)+" 词数: "+String.valueOf(wordCount)+" 总行数： "+String.valueOf(lineCount)+" 代码行数: "+String.valueOf(codeLineCount)+" 注释行数: "+String.valueOf(commentLineCount)+" 空行数:"+String.valueOf(emptyLineCount);
        return ret;
    }

    /*
    *
    * 将数据写入文件
    * */
    public static void writeFile(String fileName,String data){
        File file = new File(fileName);// 要写入的文件路径
        if (!file.exists()) {// 判断文件是否存在
            try {
                file.createNewFile();// 如果文件不存在创建文件
                System.out.println("文件"+file.getName()+"不存在已为您创建!");
            } catch (IOException e) {
                System.out.println("创建文件异常!");
                e.printStackTrace();
            }
        } else {
            System.out.println("文件"+file.getName()+"已存在!");
        }


        FileOutputStream fos = null;
        PrintStream ps = null;
        try {
            fos = new FileOutputStream(file,true);// 文件输出流	追加
            ps = new PrintStream(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String string  = data+"\r\n";// +换行
        ps.print(string); // 执行写操作
        ps.close();	// 关闭流

        System.out.println("文件写入完毕!");
    }
}
